/*
 * @lc app=leetcode.cn id=125 lang=cpp
 *
 * [125] 验证回文串
 */

#include <limits.h>

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;

// @lc code=start
class Solution {
public:
    bool isPalindrome(string s) {
        int left = 0;                   // 定义左端点
        int right = s.size() - 1;       // 定义右端点
        bool result = true;

        while (left < right) {
            // 从两侧向内寻找第一个数字或者字母
            while (left < s.size() && !isValid(s[left])) {
                left++;
            }
            while (right >= 0 && !isValid(s[right])) {
                right--;
            }
            if (left >= right || left >= s.size() || right < 0) {
                break;
            }
            
            // 将字符转换为数字并进行比较
            int leftValue = getValue(s[left++]);
            int rightValue = getValue(s[right--]);
            if (leftValue != rightValue) {
                result = false;
                break;
            }
        }
            
        return result;
    }

    // 判断字符是否为数字或者字母
    bool isValid(char c) {
        if ('0' <= c && c <= '9') {
            return true;
        } else if ('a' <= c && c <= 'z') {
            return true;
        } else if ('A' <= c && c <= 'Z') {
            return true;
        }
        return false;
    }

    // 该函数将数字或者字母转化为相应的数字
    int getValue(char c) {
        if ('0' <= c && c <= '9') {
            return c;
        } else if ('a' <= c && c <= 'z') {
            return c - 'a';
        } else if ('A' <= c && c <= 'Z') {
            return c - 'A';
        }
        return 0;
    }
};
// @lc code=end

